﻿; ; #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; ; #Warn  ; Enable warnings to assist with detecting common errors.


; ; 日期：2020年7月8日
; ; 作者：glimmer
; ; 版本：1.1

; ; 感谢：
; ;		1. 何许人 河大的随机密码生成函数
; ;		2. Huizz RunAny作者 CMD命令后台运行函数
; ;		3. CapsLock Initializer  获取当前选中文件全路径并进行转义

; ; 功能：1. 支持加密压缩文件，密码写入压缩包的注释中，同时自动复制压缩包密码到剪切板（支持写入到文件中）
; ;		2. 支持解压加密压缩文件，密码备注于文档当中，密码前置符号必须是"：",中文格式的冒号
; ;		3. 建议使用默认的压缩格式（zip）


; glsZip(IsZip:=1,IsInstall:=1,BandizipPath:="",StrPL:=-1,StrPa:="Wwd",Strfmt:="zip",StrV:="4GB",StrL:=9,toTxt:=0){
; 	;IsZip 1-解压文件 0-压缩文件
; 	;IsInstall 	1-安装版本 0-非安装，空值则默认在影子bandizip目录下，其它位置请在参数BandizipPath中填写bandizip的主目录路径
; 	;类型 W大写 w小写 d数字 可以组合
; 	 ;BandizipPath 【bandizip路径，空值代表路径在\data\BandiZip；其它路径请写全  如 D:\Bandizip】
; 	 ;StrPa 类型 W大写 w小写 d数字 可以组合
; 	 ;StrPL——【-1-随机密码长度(10-16位)；0-取消加密功能 其它指定数字长度】
; 	 ;Strfmt 压缩包格式，支持 zip, zipx, exe, tar, tgz, lzh, iso, 7z, gz, xz
; 	 ;StrV 压缩分卷大小 支持 100MB 1GB 以及纯数字的格式
; 	 ;StrL——文件压缩率大小，取值1-9 默认最大压缩率压缩
; 	 ;toTxt 1——将压缩文件名和密码写入到桌面txt文件；其它数字则不写入
; 	 ;Type 运行过程中的模式【min-最小化 hide-隐藏】

; 	;判断bandizip软件的路径
; 	if (IsInstall=1)
; 	{
; 		BandzipExePath:="C:\Program Files\Bandizip\Bandizip.exe"
; 		bzExePath:="C:\Program Files\Bandizip\bz.exe"
; 	}
; 	else if(BandizipPath="")
; 	{
; 		BandzipExePath:=A_WorkingDir . "\Apps\BandiZip\Bandizip64.exe"
; 		bzExePath:=A_WorkingDir . "\Apps\BandiZip\bz.exe"
; 	}
; 	else
; 	{
; 		BandzipExePath:=BandizipPath . "\Bandizip64.exe"
; 		bzExePath:=BandizipPath . "bz.exe"
; 	}
; 	;判断压缩包是7z格式，如果是 强制输出压缩包的密码和压缩文件的名称
; 	if(Strfmt="7z")
; 		toTxT := 1
		
; 	if (IsZip=1)
; 		UnzipFile(BandzipExePath,bzExePath)
; 		else
; 		ZipFile(BandzipExePath,StrPL,StrPa,Strfmt,StrV,StrL,toTxt)
; 	return
; }

; ;=====================================================================o
; ;                          压缩主函数   by Glimmer                   ;|
; ;---------------------------------------------------------------------o
; ZipFile(BandzipExePath:="",StrPL:=-1,StrPa:="Wwd",Strfmt:="zip",StrV:="4GB",StrL:=9,toTxt:=0){
; 	;类型 W大写 w小写 d数字 可以组合
; 	 ;IsInstall 【1-安装版本 其它数字均代表非安装版本】
; 	 ;BandizipPath 【bandizip路径，空值代表路径在\data\BandiZip\Bandizip64.exe；其它路径请填写全路径】
; 	 ;StrPa 类型 W大写 w小写 d数字 可以组合
; 	 ;StrPL——【-1-随机密码长度；0-取消加密功能 其它指定数字长度】
; 	 ;Strfmt 压缩包格式，支持 zip, zipx, exe, tar, tgz, lzh, iso, 7z, gz, xz
; 	 ;StrV 压缩分卷大小 支持 100MB 1GB 以及纯数字的格式
; 	 ;StrL——文件压缩率大小，取值1-9 默认最大压缩率压缩
; 	 ;toTxt 1——将压缩文件名和密码写入到桌面txt文件；其它数字则不写入
; 	 ;Type 运行过程中的模式【min-最小化 hide-隐藏】
	  
; 	 ;获取文件全路径并转义
; 	 FilePath := GetFilePath4Win()

; 	 ;随机密码长度【10-16位之间】
; 	 if (StrPL=-1)
; 	 {
; 		Random ,StrPL,10,16
; 	 }


; 	if (StrPL=0)
; 		CmdBook := "bc -l:" . StrL . " -r -y -aoa" . " -v:" . StrV . " -fmt:" . Strfmt . " " . FilePath	;取消加密压缩功能
; 	else
; 	{
; 		;随机密码生成
; 		RandomStr := RandomPass(StrPa,StrPL)
; 		CmdBook := "bc -l:" . StrL . " -r -aoa  -y -p:" . RandomStr . " -v:" . StrV . " -fmt:" . Strfmt . " -cmt:解压密码(" . StrPL . "字符)：" . RandomStr . " " . FilePath
; 		clipboard = 
; 		clipboard := "解压密码：" . RandomStr
; 	}

; 	 if(toTxt=1){
	 
; 			FileAppend ,%clipboard%,%A_Desktop%\SecData.txt
; 			FileAppend ,`t,%A_Desktop%\SecData.txt
; 			FileAppend ,%RandomStr%,%A_Desktop%\SecData.txt
; 			FileAppend ,`r`n,%A_Desktop%\SecData.txt
; 	 }
; 	 BandizipCMD:= BandzipExePath . " " . CmdBook
; 	 StdOutToVar(BandizipCMD)
; 	 return
; }

; ;=====================================================================o
; ;                        解压缩主函数   by Glimmer                   ;|
; ;---------------------------------------------------------------------o
; UnzipFile(BandzipExePath:="",bzExePath:=""){
	
; 	 ;获取文件全路径并转义
; 	 FilePath := GetFilePath4Win()
; 	 ;构建软件批处理命令并赋值给SecTemp
; 	 SecCMD:= bzExePath . " l -list:v " . FilePath
; 	 SecTemp:=StdOutToVar(SecCMD)
; 	 ;数组处理得到密码
; 	 Sec:=substr(SecTemp,instr(SecTemp,"：",1,-1)+1)
; 	 ;构建解压缩批处理命令
; 	 if (Sec="")
; 			UnZipCMD:=BandzipExePath . " bx -aoa -r- -y " . FilePath
; 		else
; 			UnZipCMD:=BandzipExePath . " bx -r -aoa -y -p:" . Sec . " " . FilePath
; 	 StdOutToVar(UnZipCMD)
; 	 return
; }

; ;=====================================================================o
; ;                           河大密码生成函数                         ;|
; ;---------------------------------------------------------------------o

; RandomPass(kind:="Wwd",length:=8){
; ;类型 W大写 w小写 d数字 可以组合
; char := [1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",0,1,2,3,4,5,6,7,8,9]
; char[0] := 0 ;定义数组
; option := kind
; kind = 0 ;必须先赋值  不然后面的加法无效
; kind := InStr(option,"W",1) ? kind+100 : kind ;InStr区分大小写
; kind := InStr(option,"w",1) ? kind+10 : kind
; kind := InStr(option,"d") ? kind+1 : kind
; if kind=111
; 	min:=0,max:=61
; else if kind=110
; 	min:=10,max:=61
; else if kind=11
; 	min:=0,max:=35
; else if kind=101
; 	min:=36,max:=71
; else if kind=1
; 	min:=0,max=9
; else if kind=10
; 	min:=10,max=35
; else if kind=100
; 	min:=36,max=61
; loop % length
; {
; Random, l, %min%, %max%
; str .= char[l]
; }
; return str
; }

; ;=====================================================================o
; ;                       CapsLock Initializer                         ;|
; ;---------------------------------------------------------------------o
; GetFilePath4Win()
; {
;     ; clipboard =
; 	; clipboard := QZData("Files")
;     ; send ^c
;     ; ClipWait, 1
;     ; if ErrorLevel
;     ; {
;     ;     ToolTip,"没有粘贴成功"
;     ;     return
;     ; }
;     ; path := clipboard
;     ; if path =
;     ;     return
;     ; MouseGetPos,x0
; 	clipboard :=
;     clipboard := QZData("Files")
;     ; StringReplace, clipboard, clipboard, \, \\, All

; 	Splitpath ,clipboard,,IntUnZip_FileDir,,IntUnZip_FileNameNoExt,IntUnZip_FileDrive

;     ; tooltip Text: %clipboard% copied
; 	loop
; 	{
; 	    MouseGetPos,x1 ;鼠标挪动取消提示框
; 	    if x1!=%x0%
; 	    {
; 	        tooltip
; 	        break
; 	    }
; 	}
; 	return IntUnZip_FileDir
; }

; ;=====================================================================o
; ;				runanyctrl huizz 大佬                         		 ;|
; ;				后台运行cmd并读取cmd输出结果                         ;|
; ;---------------------------------------------------------------------o
; StdOutToVar(cmd) {
; 	DllCall("CreatePipe", "PtrP", hReadPipe, "PtrP", hWritePipe, "Ptr", 0, "UInt", 0)
; 	DllCall("SetHandleInformation", "Ptr", hWritePipe, "UInt", 1, "UInt", 1)

; 	VarSetCapacity(PROCESS_INFORMATION, (A_PtrSize == 4 ? 16 : 24), 0)    ; http://goo.gl/dymEhJ
; 	cbSize := VarSetCapacity(STARTUPINFO, (A_PtrSize == 4 ? 68 : 104), 0) ; http://goo.gl/QiHqq9
; 	NumPut(cbSize, STARTUPINFO, 0, "UInt")                                ; cbSize
; 	NumPut(0x100, STARTUPINFO, (A_PtrSize == 4 ? 44 : 60), "UInt")        ; dwFlags
; 	NumPut(hWritePipe, STARTUPINFO, (A_PtrSize == 4 ? 60 : 88), "Ptr")    ; hStdOutput
; 	NumPut(hWritePipe, STARTUPINFO, (A_PtrSize == 4 ? 64 : 96), "Ptr")    ; hStdError
	
; 	if !DllCall(
; 	(Join Q C
; 		"CreateProcess",             ; http://goo.gl/9y0gw
; 		"Ptr",  0,                   ; lpApplicationName
; 		"Ptr",  &cmd,                ; lpCommandLine
; 		"Ptr",  0,                   ; lpProcessAttributes
; 		"Ptr",  0,                   ; lpThreadAttributes
; 		"UInt", true,                ; bInheritHandles
; 		"UInt", 0x08000000,          ; dwCreationFlags
; 		"Ptr",  0,                   ; lpEnvironment
; 		"Ptr",  0,                   ; lpCurrentDirectory
; 		"Ptr",  &STARTUPINFO,        ; lpStartupInfo
; 		"Ptr",  &PROCESS_INFORMATION ; lpProcessInformation
; 	)) {
; 		DllCall("CloseHandle", "Ptr", hWritePipe)
; 		DllCall("CloseHandle", "Ptr", hReadPipe)
; 		return ""
; 	}

; 	DllCall("CloseHandle", "Ptr", hWritePipe)
; 	VarSetCapacity(buffer, 4096, 0)
; 	while DllCall("ReadFile", "Ptr", hReadPipe, "Ptr", &buffer, "UInt", 4096, "UIntP", dwRead, "Ptr", 0)
; 		sOutput .= StrGet(&buffer, dwRead, Encoding := "UTF-8")

; 	DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, 0))         ; hProcess
; 	DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, A_PtrSize)) ; hThread
; 	DllCall("CloseHandle", "Ptr", hReadPipe)
; 	return sOutput
; }